還記得剛聽到Consul Service Discovery的介紹時,感覺很神可以自動發現服務,但玩下去才發現,原來也是要先定義好service的相關資訊才能做到service discovery.
接下來會介紹如何定義一個service, 如何告訴Consul我的service長的怎麼樣子?
在開始前我會準備兩台nodes,皆安裝好Consul client 以及啟動Nginx來當作是service.
我的環境會像這樣
$ consul members
Node Address Status Type Build Protocol DC Segment
consul-server-01 10.168.1.175:8301 alive server 1.8.3 2 ithome <all>
consul-client-1 10.168.1.189:8301 alive client 1.8.3 2 ithome <default>
consul-client-2 10.168.1.149:8301 alive client 1.8.3 2 ithome <default>
定義service時,可以使用hcl或是json的格式,這裡使用hcl來作範例。
service {
name = "ithome-web"
tags = ["web","http"]
port = 80
token = "1d177b09-4528-bdb0-e5b0-e61ab7aa140a"
}
name: 告訴Consul我的service名稱。
tags: 設定tag.
port: 我的service用的是甚麼port.我的範例Nginx使用80 port.
token: 由於我們啟用了acl,所以不管做甚麼都要有token做認證。
因為在Consul client上,如果執行不帶token會報錯。
$ consul services register web-service.hcl
Error registering service "ithome-web": Unexpected response code: 403 (Permission denied)
所以必須加上一個有權限可以註冊服務的token.
$ consul services register -token 499defa4-edc9-3f80-d001-95e5df7e21a6 web-service.hcl
Registered service: ithome-web
註冊好後可以在Web UI上看到
現在ithome-web service有兩個node,接下來測試透過Consul是否可以解析的出來後面這兩台。
dig @10.168.1.175 -p 8600 ithome-web.service.consul
透過dig
並指定DNS為"10.168.1.175", port 8600
如之前說明的是Consul DNS port,可以透過參數修改,ithome-web.service.consul
為service註冊後的FQDN, domain .service.consul
也可以透過參數修改。
驗證的結果:
可以看到兩筆 A record 對應到兩台node的IP是正確的,在Consul上註冊服務後,確實可以幫我們發現服務。
$ dig @10.168.1.175 -p 8600 ithome-web.service.consul
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.amzn2.0.4 <<>> @10.168.1.175 -p 8600 ithome-web.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3674
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ithome-web.service.consul. IN A
;; ANSWER SECTION:
ithome-web.service.consul. 0 IN A 10.168.1.149
ithome-web.service.consul. 0 IN A 10.168.1.189
;; Query time: 0 msec
;; SERVER: 10.168.1.175#8600(10.168.1.175)
;; WHEN: Tue Sep 08 14:38:09 UTC 2020
;; MSG SIZE rcvd: 86